# 四、数据容器(序列)的切片操作
# 4.1 什么是序列
"""
序列是指内容连续、有序，可以使用下标索引的一类数据容器。其中，李彪、元组、字符串，均可以视为序列
"""

# 4.2 序列的常用操作 - 切片
"""
4.2.1 什么是切片
序列支持切片, 即列表、元组、字符串，均支持切片操作。
切片就是从一个序列中取出一个子序列

语法
序列对象[起始下标:结束下标:步长] -> 表示从序列中，从指定位置开始，依次取出元素，到指定位置结束，得到一个新序列:
* 起始下标表示从何处开始，可以不写，不写默认就是从头开始
* 结束下标表示何处结束，可以不写，不写默认是截取到结尾。
* 需要注意是: 起始下标和结束下标是左闭右开的
* 步长表示依次取元素的间隔。步长1表示一个一个取，步长2表示每跳过1个元素取...
* 步长为负数表示反向取。注意: 起始下标和结束下标也要反向标记
* 正取步长就为正，反取步长就为负

特别注意，切片操作不会影响原序列，而是会得到一个新序列
"""
# 4.2.2 演示

# 对list进行切片，从1开始，4结束，步长为1
lst1 = [0,1,2,3,4,5,6,7,8,9]
new_lst = lst1[1:4]
print(new_lst) # [1, 2, 3]

# 对tuple进行切片，从头开始，到最后结束，步长为1
tup1 = (0,1,2,3,4,5,6,7,8,9)
new_tup = tup1[:]
print(new_tup) # (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)

# 对str进行切片，从头开始，到最后结束，步长为2
my_str = "hello python"
new_str = my_str[::2]
print(new_str) # hlopto

# 对str进行切片，从头开始，到最后结束，步长为-1
my_str = "hello python"
new_str = my_str[::-1] #
print(new_str) # nohtyp olleh -> **将序列翻转[::-1]**

# 对列表进行切片，从3开始，到1结束，步长为-1
lst1 = [0,1,2,3,4,5,6,7,8,9]
new_lst = lst1[3:1:-1]
print(new_lst) # [3, 2]

# 对元组进行切片, 从头开始，到尾结束, 步长为-2
tup1 = (0,1,2,3,4,5,6,7,8,9)
new_tup = tup1[::-2]
print(new_tup) # (9, 7, 5, 3, 1)

# 4.2.3 练习案例: 序列的切片实践
"""
有字符串:"万过薪月,员序程马黑来，nohtyp学"
"""
# 请使用切片的方式，得到黑马程序员
my_str = "万过薪月,员序程马黑来，nohtyp学"
ans = my_str[9:4:-1]
print(ans)